package service

import (
	"context"
	"diygw-ui-go/internal/v1/dao"
	"diygw-ui-go/internal/v1/model/admin"
	"diygw-ui-go/internal/v1/model/entity"
	"fmt"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
	"time"
)

type sysMenu struct{}

// 对象实例化
func SysMenu() *sysMenu {
	return &sysMenu{}
}

// 获取列表不分页
func (s *sysMenu) GetList(ctx context.Context, in admin.SysMenulistInput) (out admin.SysMenulistOutput, err error) {
	m := dao.SysMenu.Ctx(ctx).OmitEmpty().Where("delete_time is null")
	if in.Status != "" {
		m = m.Where("status =?", in.Status)
	}
	if err = m.Scan(&out.List); err != nil {
		return
	}
	out.Total, err = m.Count()
	return
}

// 获取列表分页
func (s *sysMenu) GetListPage(ctx context.Context, in admin.SysMenulistInput) (out admin.SysMenulistOutput, err error) {
	m := dao.SysMenu.Ctx(ctx).OmitEmpty().Where(g.Map{
		"status": in.Status,
	})
	if in.MenuId > 0 {
		m = m.Where("menu_id= ?", in.MenuId)
	}
	if err = m.Page(in.PageNum, in.PageSize).Scan(&out.List); err != nil {
		return
	}
	out.Total, err = m.Count()
	return
}

// 获取详细信息,缓存10小时
func (s *sysMenu) GetOne(ctx context.Context, in admin.SysMenuOneInput) (out admin.SysMenuOneInput, err error) {
	err = dao.SysMenu.Ctx(ctx).Cache(gdb.CacheOption{
		Duration: time.Hour * 10,
		Name:     "menuID-" + gconv.String(in.MenuId),
		Force:    false,
	}).Where("menu_id", in.MenuId).Scan(&out)
	return
}

// 获取角色权限列表
func (s *sysMenu) GetMenuAdmin(ctx context.Context, _role_id int64) (out []admin.MenuAdmin, err error) {
	db := g.DB()
	rs, _ := db.GetAll(ctx, fmt.Sprintf("select r.role_id,r.role_name,r.role_key,r.data_scope,r.role_sort,rm.menu_id from sys_role_menu as rm , sys_role as r where rm.role_id=r.role_id and rm.role_id = %d", _role_id))
	_list := []struct {
		entity.SysRoleMenu
		RoleName  string `json:"roleName"    ` // 角色名称
		RoleKey   string `json:"roleKey"    `  // 角色代码
		DataScope string `json:"dataScope"  `  // 数据范围（1：全部数据权限 2：自定数据权限 3：本部门数据权限 4：本部门及以下数据权限）
		RoleSort  int    `json:"roleSort"   `  // 角色排序
		MenuId    int64  `json:"menuId"`
	}{}
	err = rs.Structs(&_list)
	if len(_list) > 0 {
		for _, _item := range _list {
			_menu, _ := SysMenu().GetOne(ctx, admin.SysMenuOneInput{MenuId: _item.MenuId})
			if _menu.MenuType == "M" || _menu.MenuType == "C" {
				out = append(out, admin.MenuAdmin{
					SysRoleMenu:     _item.SysRoleMenu,
					SysMenuOneInput: _menu,
					RoleName:        _item.RoleName,
					RoleKey:         _item.RoleKey,
					DataScope:       _item.DataScope,
					RoleSort:        _item.RoleSort,
					MenuId:          _item.MenuId,
				})
			}
		}
	}
	return
}
